﻿using FlyingCircusWebIS.Models;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FlyingCircusWebIS.Models
{
    /**
     *   As entidades de Telefone e Endereço são inerentes a entidade Pessoa
     *   Por este motivo as operações relaciondas a ela 
     *   são oferecidas diretamente neste nesta classe de serviço
     */
    public interface IPessoaService
    {
        // Pessoa
        
        Pessoa AutenticarComoUsuario(string usuario, string senha);

        List<ValidationResult> ValidarAutenticacaoUsuario(string usuario, string senha);

        List<Pessoa> ListarPessoas();

        Pessoa BuscarPessoaPorId(int id);

        List<ValidationResult> ValidarEntidadePessoa(Pessoa entidade, bool edicao);

        List<ValidationResult> ValidaAdicionarPessoa(Pessoa entidade);

        void AdicionarPessoa(Pessoa pessoa, DbTransaction transacao);

        void Adicionar(Pessoa pessoa, Endereco endereco, List<Telefone> telefones);

        List<ValidationResult> ValidaAtualizarPessoa(Pessoa entidade);

        void AtualizarPessoa(Pessoa entidade, DbTransaction transacao);

        List<ValidationResult> ValidaRemoverPorId(int id);

        List<Pessoa> ListarPessoasFiltro(string nome, string email, string cpf, string sexo);

        void RemoverPessoaPorId(int id);

        int ProximoIdPessoa(DbTransaction transacao);

        bool AtivarCad(string cod);

        bool AtivarCadAdministracao(int id);

        bool DesativarCadAdministracao(int id);

        void AtribuirDescontoParaPessoa(int id, decimal desconto);

        bool RemoverDescontoEspecial(int id);

        bool CancelarRecimentoMarketing(int id);

        bool AtivarRecebimentoMarketing(int id);

        bool RevogarDireitoAdministrativo(int id);

        bool ConcederDireitoAdministrativo(int id);

        
        // Endereço

        void AdicionarEndereco(Endereco entidade, DbTransaction transacao);
        
        void AtualizarEndereco(Endereco entidade, DbTransaction transacao);

        Endereco BuscarEnderecoPorId(int id);

        int ProximoIdEndereco(DbTransaction transacao);

        // Telefone

        void AdicionarTelefone(Telefone entidade, DbTransaction transacao);

        void AtualizarTelefone(Telefone entidade, DbTransaction transacao);

        Telefone BuscarTelefonePorId(int id);

        List<Telefone> ListarTelefonesPorIdPessoa(int id);

        int ProximoIdTelefone(DbTransaction transacao);

    }
}
